// api
import { Login , Logout } from "@/api/user";
import {
    setToken,
    getToken,
    removeToken,
    setUserid,
    getUserid,
    removeUserid,
    setUsername,
    getUsername,
    removeUsername,
    setHeadImage,
    getHeadImage,
    removeHeadImage,
    setUserRole,
    getUserRole,
    removeUserRole,
    removeActiveRouterPath,
} from "@/utils/cookies";

// State对象用于存储任意类型的数据，存储后可直接获取State对象的数据
const state = {
    collapse: JSON.parse(sessionStorage.getItem('collapse')) || false,
    token: "" || getToken(),
    username: "" || getUsername(),
    headImage: "" || getHeadImage(),
    userId: "" || getUserid(),
    userRole: "" || getUserRole() ,
};

// Getters对象用于获取State对象的数据，可以对State对象的属性进行计算并返回新结果，而不影响State对象的原始数据。
const getters = {}
// Mutations对象用于更新State对象的数据，Mutations与事件非常相似，每个Mutation都有一个字符串的事件类型（type）
// 和一个回调函数（handler）。回调函数是实际更新State数据的地方，它会接受State对象作为第一个参数。
const mutations = {

    SET_COLLAPSE(state){
        state.collapse = !state.collapse;
        sessionStorage.setItem('collapse', JSON.stringify(state.collapse));
    },

    // 设置token到cookie
    SET_TOKEN(state, value) {
        state.token = value;
        value && setToken(value);
    },
    // 设置用户名到cookie
    SET_USERNAME(state, value) {
        state.username = value;
        value && setUsername(value)
    },

    // 设置用户id到cookie
    SET_USERID(state , value) {
        state.userId = value ;
        value && setUserid(value)
    },

    // 设置用户头像到cookie
    SET_HEADIMAGE(state , value) {
        state.headImage = value
        value && setHeadImage(value)
    },

    // 设置用户角色到cookie
    SET_USERROLE(state , value) {
        state.userRole = value
        value && setUserRole(value)
    }

}
// Actions函数用于接收一个与store实例具有相同方法和属性的context对象，可以调用context.commit提交一个Mutation，
// 或者通过context.state和context.getters获取State对象的属性和Getters对象的方法。
// Actions和Mutations类似，区别如下：
// 1.Actions提交Mutations更新State对象，而不是直接更新；
// 2.Actions可以包含任意异步操作。
// 对State对象的更新既可以直接调用Mutations对象的方法，也可以使用Actions对象提交一个Mutation
const actions = {
    loginAction(context, requestData) {
        // console.log("用户登录Action requestData",requestData)
        return new Promise((resolve, reject) => {
            Login(requestData).then((response) => {
                // console.log("用户登录Action response进来了，下一行就要发起请求",response)
                let data = response.data;
                // console.log('用户登录Action请求响应的data',data)
                context.commit('SET_TOKEN', data.token);
                context.commit('SET_USERNAME', data.username);
                context.commit('SET_HEADIMAGE' , data.headImage) ;
                context.commit('SET_USERID' , data.userId) ;
                context.commit('SET_USERROLE',data.roleInfoList) ;
                resolve(response);
            }).catch(error => {
                console.log("用户登录Action失败了！")
                reject(error);
            })
        })
    },
    // 退出
    logoutAction({ commit }) {
        return new Promise((resolve, reject) => {
            Logout().then(response => {
                removeToken();
                removeUsername();
                removeUserid();
                removeHeadImage();
                removeUserRole() ;
                removeActiveRouterPath();
                commit('SET_TOKEN', '');
                commit('SET_USERNAME', '');
                commit('SET_HEADIMAGE' , '');
                commit('SET_USERID' , '');
                commit('SET_USERROLE' , '') ;
                resolve(response);
            })

        })
    }

}
export default {
    // 命名空间，为每个模块添加一个前缀名，需要确保模块命名不冲突
    namespaced: true,
    state,
    getters,
    mutations,
    actions
};